﻿using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Xml.Linq;

namespace SampleWpf.ViewModels
{
    public partial class SampleViewModel :ObservableObject
    {
        //通知依赖属性
        //假设你有一个 FullName 想要在更改 Name 时发出通知的属性。 可以使用 属性执行此操作 NotifyPropertyChangedFor
        //可以用_name name 或者 m_name 都可以生成Name类
        [ObservableProperty]
        [NotifyPropertyChangedFor(nameof(FullName))]
        private string m_name = "这是个NAME";

        //会自动生成FullName类
        [ObservableProperty]
        private string? fullName;

        //private ICommand? updateNameCommand;

        //public ICommand UpdateNameCommand => updateNameCommand ??= new RelayCommand(UpdateName);

        //使用[RelayCommand]后，系统会自动把UpdateName生成一个private RelayCommand? updateNameCommand;UI可以绑定UpdateNameCommand

        //会自动生成IsUpdate属性 第一个字母变成大写
        [ObservableProperty]
        [NotifyCanExecuteChangedFor(nameof(UpdateNameCommand))]
        private bool isUpdate;

        ////可以简化直接使用
        //[RelayCommand(CanExecute = nameof(IsUpdate))]
        //private void UpdateName()
        //{
        //    this.Name = "Tom2";
        //}

        //也可以异步变化，格式如下，UpdateNameAsync 会被生成 UpdateNameCommand而不是UpdateNameAsyncCommand
        [RelayCommand(CanExecute = nameof(IsUpdate))]
        private async Task UpdateNameAsync()
        {
            await Task.Delay(10).ContinueWith((t) =>
            {
                this.Name = "Tom3";
            });

        }

        //public bool CanExcuteUpdateName()
        //{
        //    return isUpdate;
        //}
    }
}
